package com.dengcj.util;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

/**
 * @author dengchunjie
 * @Description: 日期时间工具类，主要目的是标准化日期和时间格式
 * 常规日期格式 yyyy-MM-dd
 * 常规时间格式 HH:mm:ss
 * Ecologu日期时间浏览按钮格式 yyyy-MM-dd HH:mm
 * Ecology时间浏览按钮格式 HH:mm
 * @date 2022/1/11/ 09:54
 */
public class CjDateTimeUtil {
    private SimpleDateFormat dateSdf = new SimpleDateFormat("yyyy-MM-dd");
    private SimpleDateFormat timeSdf = new SimpleDateFormat("HH:mm:ss");

    private SimpleDateFormat weaTimeSdf = new SimpleDateFormat("HH:mm");
    private SimpleDateFormat weaDateTimeSdf = new SimpleDateFormat("yyyy-MM-dd HH:mm");

    private Date now;

    private String date;

    private String time;

    public CjDateTimeUtil(){
        this.now = new Date();
        this.date = dateSdf.format(now);
        this.time = timeSdf.format(now);
    }

    public void setDateFormat(String dateSdf) {
        this.dateSdf = new SimpleDateFormat(dateSdf);
        this.date = this.dateSdf.format(this.now);
    }

    public void setTimeFormat(String timeSdf) {
        this.timeSdf = new SimpleDateFormat(timeSdf);
        this.time = this.timeSdf.format(this.now);
    }

    public String getDate(){
        return this.date;
    }

    public String getTime(){
        return this.time;
    }

    /**
     * 根据指定格式转换为默认格式的日期时间字符串
     * @param dateStr
     * @param format
     * @return
     */
    public String getDateFromStr(String dateStr,String format){
        try {
            SimpleDateFormat tempFormat = new SimpleDateFormat(format);
            return dateSdf.format(tempFormat.parse(dateStr));
        }catch (ParseException e){
            e.printStackTrace();
            return "";
        }
    }

    /**
     * 获取默认的日期时间格式字符串 yyyy-MM-dd HH:mm:ss
     * @return
     */
    public String getDateTime(){
        return this.date+" "+this.time;
    }

    /**
     * 获取Ecology时间格式字符串，HH:mm
     * 适用于Ecology9的时间浏览按钮
     * @return
     */
    public String getWeaTime(){
        return weaTimeSdf.format(now);
    }

    /**
     * 获取Ecology日期时间格式字符串，yyyy-MM-dd HH:mm
     * 适用于Ecology9的日期时间浏览按钮
     * @return
     */
    public String getWeaDateTime(){
        return weaDateTimeSdf.format(now);
    }

    /**
     * 获取当前时间的字符串，实例化时的时间不会被覆盖
     * @return
     */
    public String getTimeNow(){
        Date now = new Date();
        return timeSdf.format(now);
    }

    /**
     * 获取指定格式的时间字符串
     * @param format
     * @return
     */
    public String getFormat(String format){
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        return sdf.format(now);
    }

    /**
     * 通过时间秒毫秒数判断两个日期间隔的天数
     * @param dateStr1
     * @param dateStr2
     * @return
     */
    public int getDays(String dateStr1, String dateStr2){
        try {
            Date date1 = dateSdf.parse(dateStr1);
            Date date2 = dateSdf.parse(dateStr2);
            int days = (int) ((date2.getTime() - date1.getTime()) / (1000 * 3600 * 24));
            return days;
        }catch (Exception e){
            return 0;
        }
    }

    /**
     * 通过时间秒毫秒数判断指定日期与今天间隔的天数
     * @param dateStr
     * @return
     */
    public int getDays(String dateStr){
        try {
            Date date1 = dateSdf.parse(dateStr);
            Date date2 = dateSdf.parse(dateSdf.format(new Date()));
            int days = (int) ((date1.getTime() - date2.getTime()) / (1000 * 3600 * 24));
            return days;
        }catch (Exception e){
            e.printStackTrace();
            return 0;
        }
    }

    /**
     * 日期加减天数
     * @param dateStr
     * @param n
     * @return
     */
    public String calDays(String dateStr, int n){
        try {
            Date dateTime = dateSdf.parse(dateStr);
            return dateSdf.format(dateTime.getTime() + n * 24 * 60 * 60 * 1000L);
        } catch (Exception e){
            return dateStr;
        }
    }


    /**
     * 日期加减天数
     * @param date
     * @param n
     * @return
     */
    public String calDays(Date date, int n){
        try {
            return dateSdf.format(date.getTime() + n * 24 * 60 * 60 * 1000L);
        } catch (Exception e){
            return dateSdf.format(date);
        }
    }

    /**
     * 时间戳转日期 （到天）
     * @param timestampStr
     * @return
     */
    public String timestamp2DateStr(String timestampStr){
        return dateSdf.format(new Date(Long.parseLong(timestampStr)));
    }

    /**
     * 时间戳转时间格式 （到秒）
     * @param timestampStr
     * @return
     */
    public String timestamp2DateTimeStr(String timestampStr){
        return timeSdf.format(new Date(Long.parseLong(timestampStr)));
    }

    public static void main(String[] args) {
        CjDateTimeUtil dateTimeUtil = new CjDateTimeUtil();

        System.out.println(dateTimeUtil.getDays("2022-04-17"));
        System.out.println(dateTimeUtil.getDays("2022-04-18", "2022-04-19"));
    }
}
